#include "singleview.h"
#include <QFileInfo>
#include "common.h"
#include <QHBoxLayout>
#include <QApplication>
#include <QBitmap>

int SingleView::m_id = qRegisterMetaType<SingleView*>();

SingleView::SingleView(QWidget *parent)
    :ViewObject(parent)
    ,m_paramIdentity(NULL)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_DeleteOnClose);

#ifdef __linux__
    setFocusPolicy(Qt::NoFocus);
#else
    setFocusPolicy(Qt::StrongFocus);
#endif

    if (m_objectParam == NULL)
       m_objectParam = new ParamObject;

    if (m_paramIdentity == NULL)
        m_paramIdentity = new SingleViewParam;
}

SingleView::~SingleView()
{
    if (m_paramIdentity != NULL)
        delete m_paramIdentity;

    if (m_objectParam != NULL)
        delete  m_objectParam;

    m_paramIdentity = NULL;
    m_objectParam = NULL;
}

QString SingleView::FindCss(QString prefix, QString url_origin, QString url_with_suffix)
{
    Q_UNUSED(prefix);
    Q_UNUSED(url_origin); 
    if (url_with_suffix == "" || ".gif" == url_with_suffix.right(4) || ".hqv" == url_with_suffix.right(4))
        return url_with_suffix;

    if (url_with_suffix.contains("##"))
        return url_with_suffix;

    //arrive all interval
    QString filename_without_xml = mFilename.left(mFilename.size() - 4);

    QStringList list = filename_without_xml.split("_");

    QString ui_type = list.at(ParamType);
    return ui_type + QString("_") + m_objectParam->GetName() + QString("##") + url_with_suffix;

}

QString SingleView::FindHqt(QString prefix, QString url)
{
    Q_UNUSED(prefix);
    return url + QString(".hqt");
}

QString SingleView::FindFile(QString prefix, QString name)
{

//    LOG_QDEBUG<<"----------------------------------------"<<prefix;
    if (name == "" || name == "hide")
        return "";
    QString ret;

    ret = myapp::find_file_single(prefix, name);
    if (ret != "")
    {
        AddSuffix(ret);
        return ret;
    }

    if (name.contains("##"))
    {
        QStringList list = name.split("##");
        ret = myapp::find_file_single(prefix, list.at(1));
        if (ret != "")
        {
            AddSuffix(ret);
            if (list.at(0) != "")
                return list.at(0) + QString("##") + ret;
            else
                return ret;
        }
    }
    //前面都找不到最终去寻找配置文件
    return FindHqt(prefix, name);
}

void SingleView::ShowObject()
{
    if (!m_paramIdentity || !m_objectParam) return;

    url = m_paramIdentity->m_resNormalPath;

    ShowUrl();
}

void SingleView::GetAttribute(std::string& attribute)
{
    std::string jsonStr;
    Json::Value base;
    Json::StreamWriterBuilder writerBuilder;
    std::ostringstream os;

    base["zindex"] = QString::number(m_objectParam->GetIndex()).toStdString();
    base["stid"] = QString::number(m_objectParam->GetStId()).toStdString();
    base["x"] = QString::number(m_objectParam->GetX()).toStdString();
    base["y"] = QString::number(m_objectParam->GetY()).toStdString();
    base["w"] = QString::number(m_objectParam->GetWidth()).toStdString();
    base["h"] = QString::number(m_objectParam->GetHeight()).toStdString();
    base["name"] = m_objectParam->GetName().toStdString();
    base["normal"] = m_paramIdentity->m_resNormalPath.toStdString();

    std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
    jsonWriter->write(base, &os);
    jsonStr = os.str();

    attribute = jsonStr;
}

void SingleView::SetAttribute(std::string jsonStr)
{
    bool res;
    JSONCPP_STRING errs;
    Json::Value root;
    Json::CharReaderBuilder readerBuilder;
    std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
    res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str()+jsonStr.length(), &root, &errs);

    if (!res || !errs.empty())
         LOG_QDEBUG<<__FUNCTION__<<"json parse faild"<<QString::fromStdString(errs);

    if (CheckJsonValueType(root,"zindex",Json::stringValue))
         m_objectParam->SetIndex(QString::fromStdString(root["zindex"].asString()).toInt());

    if (CheckJsonValueType(root,"stid",Json::stringValue))
         m_objectParam->SetStId(QString::fromStdString(root["stid"].asString()).toInt());

    if (CheckJsonValueType(root,"x",Json::stringValue))
        m_objectParam->SetX(QString::fromStdString(root["x"].asString()).toInt());

    if (CheckJsonValueType(root,"y",Json::stringValue))
        m_objectParam->SetY(QString::fromStdString(root["y"].asString()).toInt());

    if (CheckJsonValueType(root,"w",Json::stringValue))
         m_objectParam->SetWidth(QString::fromStdString(root["w"].asString()).toInt());

    if (CheckJsonValueType(root,"h",Json::stringValue))
         m_objectParam->SetHeight(QString::fromStdString(root["h"].asString()).toInt());

    if (CheckJsonValueType(root,"name",Json::stringValue))
         m_objectParam->SetName(QString::fromStdString(root["name"].asString()));

    if (CheckJsonValueType(root,"normal",Json::stringValue))
        m_paramIdentity->m_resNormalPath = QString::fromStdString(root["normal"].asString());
}

void SingleView::ParseXML(QDomElement* xmlDomEle)
{
    if (NULL == m_paramIdentity)
        m_paramIdentity = new SingleViewParam;

    m_objectParam->SetIndex((xmlDomEle->attribute("zindex","0")).toInt());
    m_objectParam->SetStId((xmlDomEle->attribute("stid","0")).toInt());
    m_objectParam->SetX((xmlDomEle->attribute("x","0")).toInt());
    m_objectParam->SetY((xmlDomEle->attribute("y","0")).toInt());
    m_objectParam->SetWidth((xmlDomEle->attribute("w","0")).toInt());
    m_objectParam->SetHeight((xmlDomEle->attribute("h","0")).toInt());
    m_objectParam->SetName(xmlDomEle->attribute("name",""));

    QDomNodeList paramlist = xmlDomEle->childNodes();
    for (int listcnt = 0; listcnt < paramlist.count(); listcnt++)
    {
        QDomElement param = paramlist.item(listcnt).toElement();
        if (param.isComment()||param.isNull())
            continue;
        QString temp = param.attribute("normal", "");
        if (temp != "")
           m_paramIdentity->m_resNormalPath = temp;
    }
}

void SingleView::PacketXML(QDomElement* dom)
{
    QDomDocument document;
    *dom = document.createElement("item");
    dom->setAttribute("type",m_objectParam->GetObjectName());
    dom->setAttribute("zindex", QString::number(m_objectParam->GetIndex()));
    dom->setAttribute("stid", QString::number(m_objectParam->GetStId()));
    dom->setAttribute("x", QString::number(m_objectParam->GetX()));
    dom->setAttribute("y", QString::number(m_objectParam->GetY()));
    dom->setAttribute("w", QString::number(m_objectParam->GetWidth()));
    dom->setAttribute("h", QString::number(m_objectParam->GetHeight()));
    dom->setAttribute("name", m_objectParam->GetName());

    QDomElement dom1 = document.createElement("param");
    dom1.setAttribute("normal", m_paramIdentity->m_resNormalPath);
    dom->appendChild(dom1);
}

